minigui输入法汉字的获取 |
您所在的位置:网站首页 › gptcache 输入中文返回结果一样 › minigui输入法汉字的获取 |
minigui的中文输入法是内嵌在mgi库中的,现在把它剥离出来,从而实现自定义的定制。 1. 前言经过各种调试,现在能实现的功能:输入拼音字母,返回中文候选字/候选词,而点击候选字显示联想字应该也是一样道理,尚未调试。 这里共用到了3个文件:ime_pinyin.c, ime_pinyin.h, ime_tab_pinyin.h 其中ime_tab_pinyin.h是词库,即你输入拼音,然后返回对应的汉字/词,举例:输入ni, 会出现 你 尼 拟 妮 泥 倪 … 词库文件的制作可以参看大神的文章:minigui词库更新 2. 下面说一下主要函数:下面说一下主要函数: 说明: 所有的函数中使用的字符串长度最大值是32 #define SW_STR_LEN 32A. 拼音转汉字函数 int pinyin_translate_word(void *method, const char *strokes, char *buffer, int buffer_len, int index)函数说明:该函数输入一个字符串,会返回候选汉字。 参数说明: method: 这里没有用,传NULL就行; strokes: 输入的字符串,比如ni buffer: 返回的字/ 词语(注意:这里返回的汉字是gb2312格式) buffer_len: 这里不太明白具体含义,不过一般传入32,传入32时返回的汉字个数是10,如果改大了,那么就会返回大于10个汉字。 index: 从词库匹配的第几个汉字开始返回,举例输入ni,那么词库中ni的前20个汉字是:你 泥 尼 呢 逆 拟 尿 妮 霓 倪 匿 腻 溺 伲 坭 猊 怩 昵 旎 祢,此时index传入0的话,会返回前10个汉字,传入2的话,会返回第2-12个汉字。 返回值:本次返回汉字中最后一个汉字在整个匹配汉字中的索引。举例:buffer_len 输入32,index输入0的时候,返回值是10,index是5的时候,返回值是15. 备注:返回的汉字有时候有不对的情况,比如上面输入ni 结果返回的汉字中有个"尿"字…,这是因为词库不准确导致的。另外输入nihao,不会返回你好,是因为词库中没有nihao这个字符串, 所以维护词库也是个重要的事情。 B. 汉字联想函数 int pinyin_predict_pord(void *method, const char *lookfor, char * buffer, int buffer_len, int index);函数说明:该函数输入一个汉字,会返回该汉字的联想汉字。比如输入你,会返回:“好”,“的”,“们”,“在”,“是” 等可以和"你"组词的汉字 参数说明:和上面函数类似(目前尚未测试该函数) 返回值:未测试 备注: 未测试 C. 字符串拼接函数 void append(char* str, char c, int len, int flag)函数说明:该函数将输入的单个字符拼接成字符串。 备注:len一般传入 SW_STR_LEN - 2, flag 这里用不到 D. 字符串转小写函数 void strcpylower(char* buf, const char* str)函数说明:函数A拼音转汉字函数要求输入的字符串是小写,因此需要先用该函数转一下,再调用函数A 3. 调用流程1) 定义字符串 定义一个输入字符串: char in_str[SW_STR_LEN],一个输入转换字符串: char in_str_tmp[SW_STR_LEN]和一个输出字符串: char out_str[SW_STR_LEN].2) 将输入的单个英语字符全部大写: char ch = toupper('n'); char ch1 = toupper('i');3) 使用append函数将步骤2中的字符拼接到字符串中: append(in_str_tmp, ch, SW_STR_LEN - 2, 2); append(in_str_tmp, ch1, SW_STR_LEN - 2, 2);4) 使用strcpylower将步骤3中的字符串全部转化为小写: strcpylower(in_str, in_str_tmp);5) 调用 pinyin_translate_word函数得到候选字: pinyin_translate_word(NULL, in_str, out_str, SW_STR_LEN, 0);说明: 由上面步骤可以看出其实如果能保证输入的都是小写的话,只用步骤3即可。上面得到的out_str是候选汉字的字符串数组,是gb2312格式的,有的情况下可能需要转成utf8格式才能正常显示,转换函数如下,其中buffer是转换之后的字符串,characters是步骤5中的out_str,length是out_str的长度,encode是编码方式,这里是”gb2312“ int convert2utf8(unsigned char *buffer, const unsigned char* characters, size_t mbs_length, char* encode) { int conved_mbs_len, ucs_len; char buffer2[1024]; PLOGFONT logfont = CreateLogFont (NULL, "arial", encode, FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL, FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 12, 0); assert(logfont); const unsigned char* source = characters; ucs_len = MBS2WCSEx (logfont, (void *)buffer2, FALSE, source, mbs_length, sizeof(buffer2), &conved_mbs_len); DestroyLogFont(logfont); logfont = CreateLogFont (NULL, "arial", "utf8", FONT_WEIGHT_REGULAR, FONT_SLANT_ROMAN, FONT_SETWIDTH_NORMAL, FONT_SPACING_CHARCELL, FONT_UNDERLINE_NONE, FONT_STRUCKOUT_NONE, 12, 0); assert(logfont); ucs_len = WCS2MBSEx (logfont, (unsigned char *)buffer, (unsigned char *)buffer2, ucs_len, FALSE, sizeof(buffer2), &conved_mbs_len); DestroyLogFont(logfont); return ucs_len; } |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |